<?php

class tracker
{

// Объект, содержащий текущую (и единственную) копию объекта (Singleton)
static private $instance = null;

private $trackerName;        // Переменная, содержащая название трекера
private $trackerDescription; // Переменная, содержащая описание трекера
private $inviteCount;        // Переменная, содержащая количество инвайтов на трекер
private $questionsArray;     // Переменная, содержащая массив с вопросами   


/**
 * Конструтор класса
 * 
 * @return void
 */
private function __construct() {
    // В дальнейшем тут будет код конструктора
}

 /**
 * Функция возвращает список трекеров с основной информацией.
 * Данная информация используется на главной странице.
 * 
 * @param  bool $onlyWithInvites  Необязательный параметр. Если значение параметра - TRUE, то
 *                                из БД будет извлекаться только информация о трекерах с
 *                                количеством инвайтов более одного. Иначе будут извлекаться все
 *                                данные. По умолчанию - TRUE.
 * @return array                  Массив со списком трекеов и основной информаций о них
 */
function getTrackerList($onlyWithInvites = true) {
    if($onlyWithInvites) {
        mysql::getInstance()->select('trackers', array('id', 'name', 'inviteCount', 'inviteStatus'), null, 'inviteCount > 0');
    } else {
        mysql::getInstance()->select('trackers', array('id', 'name', 'inviteCount', 'inviteStatus'));
    }
    while($data = mysql::getInstance()->fetch()) {
        $dataArray[] = $data;
    }
    return $dataArray;
}


 /**
 * Функция записывает данные о трекере в переменную
 * 
 * @param  integer $trackerId  ID трекера, по которому необходимо получить информацию
 * @param  mixed   $fields     Какие данные необходимо получать. По умолчанию функция получает все
 *                             данные о трекере. Параметр может быть как массивом так и строкой.
 * @return array               Массив с информацией о трекере
 */
function getDataById($trackerId, $fields = '*') {
    mysql::getInstance()->select('trackers', $fields, 1, array('id' => $trackerId));
    // Данные получаем только в случае, если в БД только один элемент с таким ID
    if (mysql::getInstance()->numRows() == 1) {
        return mysql::getInstance()->fetch();
    }
}


function getNameById($trackerId) {
     mysql::getInstance()->select('trackers', 'name', 1, array('id' => $trackerId));
    // Данные получаем только в случае, если в БД только один элемент с таким ID
    if (mysql::getInstance()->numRows() == 1) {
        $data = mysql::getInstance()->fetch();
        return $data['name'];
    }
}



/**
 * Функция записывает в переменную trackerName указанное имя трекера
 * 
 * @param  string $name  Название трекера
 * @return void
 */
function setName($name) {
    $this->trackerName = $name;
}


/**
 * Функция возвращает название трекера
 * 
 * @return string  Название трекера
 */
function getName() {
    return $this->trackerName;
}


/**
 * Функция записывает в переменную trackerDescription указанное описание трекера
 * 
 * @param  string $description  Описание трекера
 * @return void
 */
function setDescription($description) {
    $this->trackerDescription = $description;
}


/**
 * Функция возвращает описание трекера
 * 
 * @return string  Описание трекера
 */
function getDescription() {
    return $this->trackerDescription;
}


/**
 * Функция записывает в переменную inviteCount указанное количество инвайтов
 * 
 * @param  integer $inviteCount  Количество инвайтов
 * @return void
 */
function setInviteCount($inviteCount) {
    $this->inviteCount = (int)$inviteCount;
}


/**
 * Функция возвращает количество инвайтов
 * 
 * @return string  Количество инвайтов
 */
function getInviteCount() {
    return $this->inviteCount;
}


/**
 * Функция возвращает список вопросов в виде массива
 * 
 * @return array  Список вопросов в виде массива
 */
function getQuestionArray() {
    return $this->questionsArray;
}


/**
 * Функция возвращает список вопросов в сериализированном виде
 * 
 * @return string  Список вопросов в сериализированном виде
 */
function getSerializedQuestionArray() {
    return serialize($this->questionsArray);
}


/**
 * Функция записывает в переменную questionsArray массив с вопросами
 * 
 * @param  array $questionsArray  Массив с вопросами
 * @return void
 */
function setQuestionArray($questionsArray) {
    $this->questionsArray = $questionsArray;
}


/**
 * Функция добавляет информацию о трекере в базу данных
 * 
 * @return void
 */
function add() {
    mysql::getInstance()->insert('trackers', array('',
                                                   $this->getName(),                    // Название
                                                   $this->getDescription(),             // Описание
                                                   $this->getSerializedQuestionArray(), // Вопросы
                                                   $this->getInviteCount(),             // Инвайтов
                                                   INV_STATUS_OPEN));                   // Статус
}


function exists($id) {
    mysql::getInstance()->select('trackers', 'id', null, array('id' => $id));
    if (mysql::getInstance()->numRows() == 0) {
        return false;
    } else {
        return true;
    }
}


/**
 * Функция возвращает объект, если он был создан. Если объект не создан - функция создаёт объект
 * и вызывает его (Singleton)
 *
 * @static
 * @return object  Текущая копия объекта
 */
static function getInstance() {
    if (self::$instance == null) {
        self::$instance = new self();
    }
    return self::$instance;
}

}